using System;
using iTextSharp.text;
using iTextSharp.text.pdf;
//using com.lowagie.text;
//using com.lowagie.text.pdf;
using System.IO;
using PlanInterfejs;
using System.Collections.Generic;
using System.Linq;

/// <summary>
/// Generator PDFów.
/// 
/// Bartku, niech Twoja klasa implementuje po prostu
/// interfejs ISchedulePdfCreator. Reszta metod/zmiennych Twojej klasy ma być
/// PRYWATNA. Na dole dodałem już pieniek. Wtedy będę mógł coś z tym zrobić.
/// 
/// Zmień też proszę nazwę klasy na "SchedulePdfCreator", a metody w
/// TakiSposobJakWDotNet, bo taka jest konwencja nazewnictwa klas w C#!!!
/// </summary>

namespace PlanInterfejs
{

    public class SchedulePdfCreator : ISchedulePdfCreator
    {
        private IQueryable<Zajecia> listaZajec;
        private int ID_Klasa; //Numer ID klasy dla której generujemy plan - TRZEBA USTAWIĆ JAKO PIERWSZE
        private List<string> godzinyZajec;//tabela zawierające łańcuchy znaków będące reprezentacją uporządkowanych godzin zajęć
        private string nazwaPliku;// = "plan_zajec_";//Nazwa pliku wynikowego (musi mieć rozszerzenie .pdf)
        private List<string> dniZajec;

        /*public void SetNazwaPlikuPdf(string x)
        {
            this.nazwaPliku = x + ".pdf";
        }*/

        private void GetGodzinyZajec()
        {
            var results = from p in DAL.database.Godziny_Zajec
                          orderby p.NumerPorzadkowy
                          select p;

            List<string> wynik = new List<string>();

            foreach (Godziny_Zajec gz in results)
            {
                string przedzial = gz.Czas_Poczatek.Hours.ToString() + ":" +
                    gz.Czas_Poczatek.Minutes.ToString();
                przedzial += "-";
                przedzial += gz.Czas_Koniec.Hours.ToString() + ":" +
                    gz.Czas_Koniec.Minutes.ToString();
                wynik.Add(przedzial);
            }

            this.godzinyZajec = wynik;
        }

        private void GetDniZajec()
        {
            var results = from p in DAL.database.Dzien
                          orderby p.Nr
                          select p;

            List<string> wynik = new List<string>();

            foreach (Dzien dz in results)
            {
                string dzien = dz.Nazwa.ToString();

                wynik.Add(dzien);
            }

            this.dniZajec = wynik;
        }

        private void GetListaZajec()
        {
            /*var results = from p in DAL.database.Zajecia                                        //p.
                          join m in DAL.database.Plan_Zajec on p.ID_Zajecia equals m.ID_Zajecia //p.Sala.
                          join n in DAL.database.Grupa on m.ID_Klasa equals n.ID_Grupa
                          join o in DAL.database.Przedmiot_Typy on p.ID_Przedmiot_Typy equals o.ID_Przedmiot_Typy
                          join r in DAL.database.Godziny_Zajec on p.ID_Godziny_Zajec equals r.NumerPorzadkowy
                          join s in DAL.database.Sala on p.ID_Sala equals s.ID_Sala
                          join t in DAL.database.Nauczyciel on p.ID_Nauczyciel equals t.ID_Nauczyciel
                          where n.ID_Grupa == this.ID_Klasa
                          select new { r.NumerPorzadkowy, r.Czas_Poczatek, r.Czas_Koniec, o.Nazwa, t.Imie, t.Nazwisko, s.Numer};
            this.listaZajec = results;*/
            var results = from p in DAL.database.Zajecia
                          select p;
            this.listaZajec = results;

        }

        private void CreateEmptyPdf(Grupa grupa)
        {
            this.ID_Klasa = grupa.ID_Grupa;

            this.GetGodzinyZajec();
            this.GetDniZajec();

            BaseFont bfR;
            bfR = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            Font times = new Font(bfR, 12, Font.NORMAL, BaseColor.BLACK);

            Document docPdf = new Document(PageSize.A4.Rotate());

            //this.nazwaPliku = "plan_zajec_" + Convert.ToString(this.ID_Klasa) + ".pdf";

            PdfWriter drukarkaPdf = PdfWriter.GetInstance(docPdf, new FileStream(this.nazwaPliku, FileMode.Create));

            

            docPdf.Open();

            PdfPTable table = new PdfPTable(this.dniZajec.Count + 1);

            PdfPCell title = new PdfPCell(new Phrase("Plan zajec", times));
            title.Colspan = this.dniZajec.Count + 1;
            title.HorizontalAlignment = 1;
            table.AddCell(title);
            table.AddCell("");
            foreach (string i in this.dniZajec)
            {
                PdfPCell tempCell = new PdfPCell(new Phrase(i));
                tempCell.HorizontalAlignment = 1;
                table.AddCell(tempCell);
            }

            foreach (string x in this.godzinyZajec)
            {
                PdfPCell tempCell = new PdfPCell(new Phrase(x));
                tempCell.HorizontalAlignment = 1;
                table.AddCell(tempCell);
                for (int y = 0; y < this.dniZajec.Count; y++)
                    table.AddCell("");
            }

            docPdf.Add(table);
            docPdf.Close();
        }

        private void CreateFilledPdf(Grupa grupa)
        {
            this.ID_Klasa = grupa.ID_Grupa;

            this.GetGodzinyZajec();
            this.GetDniZajec();
            this.GetListaZajec();

            Document docPdf = new Document(PageSize.A4.Rotate());

           //this.nazwaPliku = "plan_zajec_" + Convert.ToString(this.ID_Klasa) + ".pdf";

            PdfWriter drukarkaPdf = PdfWriter.GetInstance(docPdf, new FileStream(this.nazwaPliku, FileMode.Create));

            docPdf.Open();

            PdfPTable table = new PdfPTable(this.dniZajec.Count + 1);

            PdfPCell title = new PdfPCell(new Phrase("Plan zajec"));
            title.Colspan = this.dniZajec.Count + 1;
            title.HorizontalAlignment = 1;
            table.AddCell(title);
            table.AddCell("");
            foreach (string i in this.dniZajec)
            {
                PdfPCell tempCell = new PdfPCell(new Phrase(i));
                tempCell.HorizontalAlignment = 1;
                table.AddCell(tempCell);
            }

            //int addedCells;
            foreach (string x in this.godzinyZajec)
            {
                PdfPCell tempCell = new PdfPCell(new Phrase(x));
                tempCell.HorizontalAlignment = 1;
                table.AddCell(tempCell);

                //addedCells = 0;
                foreach (string y in this.dniZajec)
                {
                    bool ZajZnal = false;//sprawdzanie, czy dla danej komórki znaleziono kurs, którym ją się wypełni, jak nie, to doda pustą komórkę
                                        //naprawia błąd z całkowicie wypełnionym planem.

                    foreach (Zajecia lz in this.listaZajec)
                    {
                        lz.Plan_Zajec.Load();
                        lz.Plan_Zajec.First().GrupaReference.Load();
                        
                        //lz.Plan_ZajecReference.Load();
                        //lz.GrupaReference.Load();
                        lz.Przedmiot_TypyReference.Load();
                        lz.Godziny_ZajecReference.Load();
                        lz.SalaReference.Load();
                        lz.NauczycielReference.Load();
                        lz.DzienReference.Load();

                        string tempGodz = lz.Godziny_Zajec.Czas_Poczatek.Hours.ToString() + ":" +
                                          lz.Godziny_Zajec.Czas_Poczatek.Minutes.ToString() + "-" +
                                          lz.Godziny_Zajec.Czas_Koniec.Hours.ToString() + ":" +
                                          lz.Godziny_Zajec.Czas_Koniec.Minutes.ToString();

                        if (lz.Plan_Zajec.First().Grupa.ID_Grupa == this.ID_Klasa && lz.Dzien.Nazwa.ToString() == y && tempGodz == x)//sprawdzanie czy dzień tygodnia i godzina
                        //zajęć odpowiada aktualnej komórce w tabeli
                        //i czy ID klasy/grupy się zgadza
                        {
                            PdfPCell tempCell_2 = new PdfPCell(new Phrase(lz.Przedmiot_Typy.Nazwa.ToString() + "\n" +
                                                                          lz.Nauczyciel.Imie.ToString() + " " +
                                                                          lz.Nauczyciel.Nazwisko.ToString() + "\n" +
                                                                          lz.Sala.Numer.ToString()));
                            tempCell_2.HorizontalAlignment = 1;
                            table.AddCell(tempCell_2);
                            ZajZnal = true;
                            //addedCells++;
                            break;
                        }
                        else
                            continue;
                    }
                    if (!ZajZnal)
                        table.AddCell("");
                }

                /*//petla ponizej: idealny przyklad prowizorki :P (jacek) *I czemu to ma służyć? (Bartek)
                for (int i = addedCells; i < 7; i++)
                {
                    table.AddCell("");
                }*/

            }

            docPdf.Add(table);
            docPdf.Close();
        }

        /// <summary>
        /// Generuje plan dla danej grupy. Zwraca obiekt implementujący ISchedulePdf,
        /// który dostarcza informacji o tym, jaka to grupa oraz ścieżkę do pliku
        /// </summary>
        /// <param name="grupa">Grupa, dla której ma być wygenerowany plan.</param>
        /// <returns>Obiekt reprezentujący wygenerowany plik PDF.</returns>
        public ISchedulePdf GeneratePdf(Grupa grupa, string sciezka)
        {
            this.nazwaPliku = sciezka;
            this.CreateFilledPdf(grupa);

            SchedulePdf a = new SchedulePdf();
            a.FileName = this.nazwaPliku;
            a.Grupa = grupa;

            return a;
            //throw new NotImplementedException();
        }
    }
    public class SchedulePdf : ISchedulePdf
    {
        public string FileName
        {
            //get { throw new NotImplementedException(); } //co tu zrobić żeby wywalić te wyjątki??? //odp: zaimplementowac :) (jacek)
            get;
            set;
        }

        public Grupa Grupa
        {
            //get { throw new NotImplementedException(); } //co tu zrobić żeby wywalić te wyjątki???
            get;
            set;
        }
    }


}
